#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <time.h>
#include <cstdio>
using namespace std;

double Division(int x, int y)
{
    if (y == 0)
        throw "Division by zero exception!";
    if (y == 4)
    {
        int a  = 10;
        cout << &a << endl;
        throw &a;
    }
        
    return (double)x / (double)y;
}

void Func() 
{
    int *arr = new int[10]; // 申请堆空间
    int x, y;
    try
    {
        while (true)
        {
            cin >> x >> y;
            cout << Division(x, y) << endl;
        }
    }
    catch (...) // 捕获任意类型的异常对象
    {
        cout << "delete[] arr" << endl;
        delete[] arr; // 释放堆空间
        throw;      // 重新抛出，捕到什么类型就抛出什么类型
    }
    // 如果不在中途捕获异常，就会跳过执行delete语句
    delete arr; // 释放堆空间
}

int main()
{
    while (true)
    {
        try
        {
            Func();
        }
        catch (const char *errstr)
        {
            cout << errstr << endl;
            exit(1);
        }
        catch (int* a)
        {
            cout << a << endl;
            cout << *a << endl;
            printf("%d\n" ,*a);
        }
        catch (...)
        {
            cout << "unkown exception" << endl;
        }

        cout << "catch之后的代码继续执行" << endl;
    }
}

// // 基类异常
// class Exception
// {
// protected:
//     string _errmsg; // 错误描述
//     int _errid;     // 错误码

// public:
//     Exception(const string &errmsg, int errid)
//         : _errmsg(errmsg),
//           _errid(errid)
//     {
//     }
//     virtual string what() const // 基类的虚函数
//     {
//         return _errmsg;
//     }
//     int geterrid() const
//     {
//         return _errid;
//     }
// };

// // 数据库派生类异常
// class SqlException : public Exception
// {
//     string _sql;

// public:
//     SqlException(const string &errmsg, int errid, const string &sql)
//         : Exception(errmsg, errid),
//           _sql(sql)
//     {
//     }

//     virtual string what() const // 重写虚函数
//     {
//         string msg = "SqlException: ";
//         msg += _errmsg;
//         msg += " | ";
//         msg += _sql;
//         return msg;
//     }
// };

// // 缓存派生类异常
// class CacheException : public Exception
// {
// public:
//     CacheException(const string &errmsg, int errid)
//         : Exception(errmsg, errid)
//     {
//     }

//     virtual string what() const // 重写虚函数
//     {
//         string msg = "CacheException: ";
//         msg += _errmsg;
//         return msg;
//     }
// };

// // 网络服务派生类异常
// class HttpException : public Exception
// {
//     string _type;

// public:
//     HttpException(const string &errmsg, int errid, const string &type)
//         : Exception(errmsg, errid),
//           _type(type)
//     {
//     }

//     virtual string what() const // 重写虚函数
//     {
//         string msg = "HttpException: ";
//         msg += _errmsg;
//         msg += " | ";
//         msg += _type;
//         return msg;
//     }
// };

// void SqlMgr()
// {
//     // 模拟出错场景，抛异常处理
//     if (rand() % 5 == 0)
//     {
//         throw SqlException("权限不足", 104, "select * from name = '张三'");
//     }
//     if (rand() % 4 == 0)
//     {
//         throw 1; // 不遵循异常规范体系抛异常
//     }

//     cout << "调用成功" << endl;
// }

// void CacheMgr()
// {
//     // 模拟出错场景，抛异常处理
//     if (rand() % 7 == 0)
//     {
//         throw CacheException("权限不足", 102);
//     }
//     if (rand() % 6 == 0)
//     {
//         throw CacheException("数据不存在", 103);
//     }

//     SqlMgr();
// }

// void HttpServer()
// {
//     // 模拟出错场景，抛异常处理
//     if (rand() % 9 == 0)
//     {
//         throw HttpException("请求资源不存在", 100, "get");
//     }
//     if (rand() % 8 == 0)
//     {
//         throw HttpException("权限不足", 101, "post");
//     }

//     CacheMgr();
// }

// int main()
// {
//     srand((unsigned int)time(nullptr));
//     while (true)
//     {
//         this_thread::sleep_for(chrono::seconds(1));
//         try
//         {
//             HttpServer();
//         }
//         catch (const Exception &e) // 捕获基类的引用
//         {
//             cout << e.what() << endl; // 多态调用what函数
//         }
//         catch (...)
//         {
//             cout << "unknown exception!" << endl;
//         }
//     }
//     return 0;
// }

// int main()
// {
//     try
//     {
//         vector<int> v(10, 5);
//         // 这里如果系统内存不够会抛异常
//         // v.reserve(100000000000);
//         // 这里越界访问会抛异常
//         v.at(10) = 100;
//     }
//     catch (const exception &e) // 捕获基类引用
//     {
//         cout << e.what() << endl;
//         cout << typeid(e).name() << endl;
//     }
//     catch (...)
//     {
//         cout << "Unkown Exception" << endl;
//     }
//     return 0;
// }